// user用户路由处理函数的存放模块

// 导入数据库模块
const db = require('../db/index')
// 导入加密bcrypt.js模块用来加密  不可逆解的加密
const bcrypt = require('bcryptjs')
// 导入生成token的jsonwebtoken包模块
const jwt = require('jsonwebtoken')
// 导入全局的配置文件
const config = require('../config')
// 导入dayjs
const dayjs = require('dayjs')


// 注册接口处理函数
const registerHandler = (req, res) => {
  let userinfo = req.body
  userinfo.ris_timer = dayjs().format("YYYY-MM-DD HH:mm:ss") //注册时间
  userinfo.log_timer = dayjs().format("YYYY-MM-DD HH:mm:ss") //登录时间
  // 定义SQL语句，查询用户是否被占用
  const sqlStr = `select * from wall_users where username=?`
  db.query(sqlStr, userinfo.username, (err, results) => {
    // 执行 SQL 语句失败
    if (err) return res.cc(err)
    // 用户名被占用
    if (results.length > 0) return res.cc('用户名被占用,请换个想法试试')
    // 账号可以正常使用,对密码进行加密
    userinfo.password = bcrypt.hashSync(userinfo.password, 10)
    // 定义插入数据语句
    const sqlInsert = 'insert into wall_users set?'
    db.query(sqlInsert, userinfo, (err, result) => {
      // 语法错误
      if (err) return res.cc(err)
      // 插入错误
      if (result.affectedRows !== 1) return res.cc('注册用户失败，请稍后重试')
      res.send({ code: 200, message: '注册用户成功' })
    })
  })
}
// 登录接口处理函数
const loginHandler = (req, res) => {
  const userinfo = req.body
  // 查询数据库中是否有此用户名存在
  const sql = 'select * from wall_users where username=?'
  db.query(sql, userinfo.username, (err, result) => {
    // 查询失败
    if (err) return res.cc(err)
    // 查询成功但查询到的数据条数不等于1
    if (result.length !== 1) return res.cc('用户名不存在')
    // 判断与查询的密码是否一致   bcrypt.compareSync:用来进行与数据库的对比
    const compareResult = bcrypt.compareSync(userinfo.password, result[0].password)
    if (!compareResult) return res.cc('密码错啦,再想想')
    // 获取用户信息生成token子串
    const user = { ...result[0], password: '' }
    // 使用jwt提供的sign关键字进行token加密  第三个配置项是token的有效期 保存一个星期
    const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: '168h' })
    // 将生成的token发送给客服端 注意: 为了方便客户端使用 Token，在服务器端直接拼接上 Bearer 的前缀
    // 根据前端要求，我们还需要拿到该用户的id
    let data = { uuId: result[0].id, token: 'Bearer ' + tokenStr }
    res.send({ code: 200, message: '登录成功', data })
  })
}
// 获取首页数据函数
// 综合板块:通过时间降序 并每次查询5条数据
// DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(timer) 查询一周内的时间
const gethomeinfo = (req, res) => {
  // 定义查询语句
  /* 
  查询第1-10条数据  SELECT * FROM Student LIMIT 0, 10;
  查询第11-20条数据  SELECT * FROM Student LIMIT 10 OFFSET 10;
  const sql = 'select * from wall_walls where week(timer) = week(now())' 查询本周内的
 */
  // 语句含义；查询wall_walls表通过timer这个字段，并查询从req.params.num开始5条数据
  // 还需要注意一个问题,排序他不属于where
  const sql = 'select * from wall_walls order by timer desc LIMIT ?,5'
  db.query(sql, req.params.num * 1, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      code: 200,
      message: '查询成功',
      data: result
    })
  })
}
// 获取一起玩板块数据
const getplayinfo = (req, res) => {
  // 定义查询语句
  const sql = 'select * from wall_walls  where num_types=3 order by timer desc LIMIT ?,5'
  db.query(sql, req.params.num * 1, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      code: 200,
      message: '查询成功',
      data: result
    })
  })
}
// 获取每日分享板块数据
const getshareinfo = (req, res) => {
  // 定义查询语句
  const sql = 'select * from wall_walls  where num_types=4 order by timer desc LIMIT ?,5'
  db.query(sql, req.params.num * 1, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      code: 200,
      message: '查询成功',
      data: result
    })
  })
}
// 获取其他板块数据
const getelseinfo = (req, res) => {
  // 定义查询语句
  const sql = 'select * from wall_walls  where num_types=5 order by timer desc LIMIT ?,5'
  db.query(sql, req.params.num * 1, (err, result) => {
    if (err) return res.cc(err)
    res.send({
      code: 200,
      message: '查询成功',
      data: result
    })
  })
}

// 统一暴露
module.exports = {
  registerHandler,
  loginHandler,
  gethomeinfo,
  getplayinfo,
  getshareinfo,
  getelseinfo
}